package com.txby.platformCore.component.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

/**
 * 订单号生成工具
* @ClassName: MakeOrderNum 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author jacking
* @date 2017年10月31日 下午7:34:27 
*
 */
public class MakeOrderNumUtil {
	/**
	 * 锁对象，可以为任意对象
	 */
	private static Object lockObj = "lockerOrder";
	/**
	 * 订单号生成计数器
	 */
	private static long orderNumCount = 0L;
	/**
	 * 每毫秒生成订单号数量最大值
	 */
	private static int maxPerMSECSize = 1000;

	/**
	 * 生成非重复订单号，理论上限1毫秒1000个，可扩展
	 * 
	 * @param tname
	 *            测试用
	 */
	public static  String  makeOrderNum() {
		// 最终生成的订单号
		String finOrderNum = "";
		try {
			synchronized (lockObj) {
				// 取系统当前时间作为订单号变量前半部分，精确到毫秒
				long nowLong = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));
				// 计数器到最大值归零，可扩展更大，目前1毫秒处理峰值1000个，1秒100万
				if (orderNumCount >= maxPerMSECSize) {
					orderNumCount = 0L;
				}
				// 组装订单号
				String countStr = maxPerMSECSize + orderNumCount + "";
				finOrderNum = nowLong + countStr.substring(1);
				orderNumCount++;
			/*	System.out.println(finOrderNum + "--" + Thread.currentThread().getName() + "::" + tname);*/
				// Thread.sleep(1000);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return finOrderNum;
	}
	
	
	/**
	 * 生成非重复22位订单号，最大支持1-9个集群机器部署
	* @Title: getOrderIdByUUId 
	* @Description: TODO(这里用一句话描述这个方法的作用) 
	* @param @return
	* @param @throws ParseException    设定文件 
	* @return String    返回类型 
	* @throws
	 */
    public static String getOrderIdByUUId() throws ParseException {
    	  Random random = new Random();
//        int machineId = 1;//最大支持1-9个集群机器部署
        int machineId =random.nextInt(100000);//最大支持100000个集群机器部署
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if(hashCodeV < 0) {//有可能是负数
            hashCodeV = - hashCodeV;
        }
    	String d=new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
//		System.out.println(new SimpleDateFormat("yyyyMMddHHmm").parse(d).getTime()/10000);
		long temp =new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(d).getTime();
        String  t=hashCodeV+String.valueOf(temp);
        return t;
    }
    
	/**
	 * 生成非重复22位订单号，最大支持1-9个集群机器部署
	* @Title: getOrderIdByUUId 
	* @Description: TODO(这里用一句话描述这个方法的作用) 
	* @param @return
	* @param @throws ParseException    设定文件 
	* @return String    返回类型 
	* @throws
	 */
    public static String getOrderIdByUUId(int machineId) throws ParseException {
//        int machineId = 1;//最大支持1-9个集群机器部署
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if(hashCodeV < 0) {//有可能是负数
            hashCodeV = - hashCodeV;
        }
    	String d=new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
//		System.out.println(new SimpleDateFormat("yyyyMMddHHmm").parse(d).getTime()/10000);
		long temp =new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(d).getTime();
        String  t=hashCodeV+String.valueOf(temp);
        return t;
    }


/*	public static void main(String[] args) throws ParseException {
		// 测试多线程调用订单号生成工具
		try {
			for (int i = 0; i < 200; i++) {
				Thread t1 = new Thread(new Runnable() {
					public void run() {
						MakeOrderNum makeOrder = new MakeOrderNum();
						makeOrder.makeOrderNum("a");
					}
				}, "at" + i);
				t1.start();

				Thread t2 = new Thread(new Runnable() {
					public void run() {
						MakeOrderNum makeOrder = new MakeOrderNum();
						makeOrder.makeOrderNum("b");
					}
				}, "bt" + i);
				t2.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
//		System.out.println(MakeOrderNumUtil.makeOrderNum());
		 System.out.println(getOrderIdByUUId());
 	    long nowLong = Long.parseLong(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()));
//		System.out.println(new SimpleDateFormat("yyyyMMddHHmm").format(new Date()));
		String d=new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
//		System.out.println(new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(d).getTime());
		
		  int max=10000;
	        int min=1;
	        Random random = new Random();

	        int s = random.nextInt(max)%(max-min+1) + min;
	        System.out.println(random.nextInt(100000));
		 

	}*/

}
